/*
1524. 和为奇数的子数组数目
给你一个整数数组 arr 。请你返回和为 奇数 的子数组数目。

由于答案可能会很大，请你将结果对 10^9 + 7 取余后返回。

示例 1：

输入：arr = [1,3,5]
输出：4
解释：所有的子数组为 [[1],[1,3],[1,3,5],[3],[3,5],[5]] 。
所有子数组的和为 [1,4,9,3,8,5].
奇数和包括 [1,9,3,5] ，所以答案为 4 。
示例 2 ：

输入：arr = [2,4,6]
输出：0
解释：所有子数组为 [[2],[2,4],[2,4,6],[4],[4,6],[6]] 。
所有子数组和为 [2,6,12,4,10,6] 。
所有子数组和都是偶数，所以答案为 0 。
*/

/**
 * 对于下标 ii 的位置的前缀和（即arr[0]+arr[1]+…+arr[i]）
可以看成2段，【0，j】和【j+1，i】 奇数前缀和 + 奇 = 偶  偶数前缀和 + 奇 = 奇
当下标 i 的位置的前缀和是偶数时，如果下标 j 满足 j < i 且下标 j 的位置的前缀和是奇数，
 则从下标 j+1 到下标 i 的子数组的和是奇数，因此，以下标 i 结尾的子数组中，和为奇数的子数组的数量即为奇数前缀和的数量odd；
当下标 i 的位置的前缀和是奇数时，如果下标 j 满足 j < i 且下标 j 的位置的前缀和是偶数，
则从下标 j+1 到下标 i 的子数组的和是奇数，因此，以下标 i 结尾的子数组中，和为奇数的子数组的数量即为偶数前缀和的数量 even。
 * @param {number[]} arr
 * @return {number}
 */
var numOfSubarrays = function (arr) {
  const MODULO = 1000000007
  let odd = 0,
    even = 1
  let subarrays = 0
  let sum = 0
  let length = arr.length
  for (let i = 0; i < length; i++) {
    sum += arr[i]
    subarrays = (subarrays + (sum % 2 == 0 ? odd : even)) % MODULO
    if (sum % 2 == 0) {
      even++
    } else {
      odd++
    }
  }
  return subarrays
}
